<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>自定义new和instanceof</title>
</head>

<body>
  <script>

    function newInstance(Type, ...args) {
      // 创建一个空对象
      const obj = {}
      // 执行Type函数, 并指定this为空对象
      const result = Type.call(obj, ...args)
      // 如果result是引用类型, new产生的结果就是它
      if (result instanceof Object) return result
      // 给实例对象添加__proto__, 值为Type的prototype
      obj.__proto__ = Type.prototype
      // 返回空对象
      return obj
    }


    // function newInstance (Fn, ...args) {
    //   const obj = {}
    //   const result = Fn.call(obj, ...args)
    //   if (result instanceof Object) return result
    //   obj.__proto__ = Fn.prototype
    //   return obj
    // }


    /* 
    看Type的prototype是否指向obj原型链上的某个对象
    */
    function myInstanceOf (obj, Type) {
      // 得到obj的原型对象
      let proto = obj.__proto__
      // 只要有
      while(proto) {
        // 判断Type的原型对象是否就是proto, 如果是直接返回true
        if (proto===Type.prototype) return true
        // 找原型对象的原型对象
        proto = proto.__proto__
      }
      // 没有找到
      return false
    }
    

    function Person(name, age) {
      this.name = name
      this.age = age
      // return {}
      // return []
      // return () => {}
      // return 1
    }

    // const p1 = new Person('Tom', 12)
    const p1 = newInstance(Person, 'Jack', 13)
    console.log(p1)

    console.log(myInstanceOf(p1, Object)) // true
    console.log(myInstanceOf(p1, Function)) // false
  </script>
</body>

</html>